<?php
class User_Model_User
{

 
 /**
  * Сколько времени ждать в секундах подтверждения 
  * регистрации пользователя в системе.
  * После этого времени пользователь будет удален с временой таблицы.
  * 
  * @var int
  */
 private $_timeAddDelRegister = 259200;
 
 
 
 /**
  * 
  * @var Zend_Db_Adapter_Pdo_Mysql
  */
 private $_db;
 
 /**
  * 
  * @var User_Model_Sql_Pdo_Mysql
  */
 private $_sql;
    
 /**
  * Регистрация пользователя в системе.
  * 
  * 
  */   
 public function __construct()
 {
   $this->_db  = Arm_Db::getAdapter();
   $this->_sql = Arm_Db::getSqlObject('User_Model_Sql', $this->_db);
 }
 
 
 
 /**
  * Если есть login а базе вернет true иначе false
  * @param string $login
  * @return bool
  */
 public function isLogin($login)
 {
   return $this->_sql->isLogin($login);
 }
/**
  * Если есть email а базе вернет true иначе false
  * @param string $email
  * @return bool
  */
 public function isEmail($email)
 {
   $email = strtolower($email);
   return $this->_sql->isEmail($email);
 }
 
 /**
  * Проверяем зарегистрирован ли ключ в таблице user
  * @param string $key
  */
 public function isKeyUser($key)
 {
   return $this->_sql->isKeyUser($key);
 }
 
 /**
  * Проверка есть ли ключ в временой таблице
  * @param unknown_type $key
  */
 public function isKeyTempTable($key)
 {
   return $this->_sql->isKeyTempTable($key);
 }
 
 /**
  * Подтвержения ключа регистрации
  * 
  * @param string $key
  * @return int id созданного пользователя
  */
 public function confirm($key)
 {
    $this->_db->beginTransaction();
    try {
    $data = $this->getUserTempRegister($key);
    // удаляем данные с temp таблицы
    $this->_sql->deleteUserTemp($key);
    // формируем данные
    $userData = unserialize($data['data']);
    $userData['date_register'] = time();
    $userData['key'] = $data['key'];
    $userData['password'] = $this->_getMd5Password($userData['password']);
    // записываем данные
    $idUser = $this->_sql->insertUserData($userData);
    $this->_db->commit();
    } catch (Exception $e) {
        $this->_db->rollBack();
        throw $e;
    }
    return $idUser;
 }
 
 /**
  * Создания нового пользователя.
  * @param array $data
  * @param string $group названия групы пользователя.
  */
 public function createNewUser($data, $group=null)
 {
    if(array_key_exists('password', $data) === false or $data['password'] === '') {
        throw new Arm_Exception(Arm_Translate::_('Паспорт должен быть указан'));
    }
    $data['password'] = $this->_getMd5Password($data['password']);
    $data['date_register'] = time();
    $data['key'] = md5($data['login'] . $data['email'] . microtime(1) . rand());
    if($group === null) {
        $groups = $this->getGroupSystem();
        $group = $groups[$data['group_name']];
    }
    
    return $this->_sql->createUserData($data, $group);
 }
 
 /**
  * Получения данных пользователя с временой таблицы
  * @param string $key
  */
 public function getUserTempRegister($key)
 {
 	return $this->_db->fetchRow($this->_sql->getUserTempRegister($key));    	
 }

 /**
  * Регистрация пользователя в системе
  * 
  * @var array $data Проверенные данные которы вело пользователь для регистрации в системе.
  */
 public function register($data)
 {
 	// удаляем старые записи
    $this->_sql->delStaleData();
 	// вставляем данные в временую таблицу
    $params = array();
    $params['date_del'] = time()+$this->_timeAddDelRegister;
    $params['key']      = md5($data['email'] . microtime(1) . rand());
    $params['data']     = serialize($data);
    $this->_sql->insertUserRegister($params);
    // отсылаем сообщение пользователю с ссылкой для подтверждения
    $this->_setMessageRegister($data['email'], $data['initial'], $params['key']);
    return;
 }
 
 
 
 /**
  * Ищет пользователя по логину или емаилу, если находит 
  * возвращает масив данных или false
  * @param  string $loginOrEmail
  * @return array|false
  */
 public function getUserLogiOrEmail($loginOrEmail)
 {
    return $this->_db->fetchRow($this->_sql->getUserLogiOrEmail($loginOrEmail));
 }
 
 /**
  * Отсылка сообщения пользователю
  * @param string $loginOrEmail существующий логин или email в системе.
  */
 public function remidPassword($loginOrEmail)
 {
 	$data = $this->getUserLogiOrEmail($loginOrEmail);
 	if($data === false) {
 		return false;
 	}
 	// Нам нужно сгенерировать ссылку для изменения пароля!!!
 	$key = md5($data['login'] . $data['email'] . microtime(1) . rand());
 	// удалим старые записи
 	$this->_sql->delStaleDataChadePassword();
 	// генерируем данные для записи
 	$input = array();
 	$input['date_del'] = time() + $this->_timeAddDelRegister;
 	$input['id_user']  = $data['id'];
 	$input['key']      = $key;
 	// запишем данные
 	$this->_sql->insertUserChadePassword($input);
 	// отсылаем сообщения пользователю с новым паролем.
    $mail = new Arm_Mail();
    $mail->setBodyTemplate('remid', array('name'=>$data['initial'], 'email'=>$data['email'], 'key'=>$key));
    $config = Arm_Module::getInstance()->getConfig('user');
    $mail->SetFrom($config->register->from->email, $config->register->from->name);
    $mail->AddAddress($data['email'], $data['initial']);
    $mail->Send();
 }
 
 /**
  * Проверка клююча для имзения паспорта
  * @param string $key
  */
 public function isKeyRemidPassword($key)
 {
   return $this->_sql->isKeyRemidPassword($key);
 }
  
 
 /**
  * Записывает новый паспорт для пользователя.
  * @param string $newPassword
  * @param string $key 
  */
 public function writeNewPassport($newPassword, $key)
 {
   $this->_db->beginTransaction();
   try {
   	// получаем данные с временой таблици
  $select = $this->_db->select();
  $select->from($this->_user_chade_password);
  $select->where('`key` = ?', $key);
  $data = $this->_db->fetchRow($this->_sql->getDataUserChadePassword($key));
  // записываем новый паспорт
  $newPassword = $this->_getMd5Password($newPassword);
  $this->_sql->updatePassword($newPassword, $data['id_user']);
  // удалим все записи по текущему пользователю в напоминании пароля.
  $this->_sql->delDataUserChadePssword($data['id_user']);
  // удалим старые записи
  $this->_sql->delStaleDataChadePassword();
  $this->_db->commit();
   }catch (Exception $e) {
   	$this->_db->rollBack();
   	throw $e;
   }
   return;
   }

   /**
    * Обновленя данных пользователя
    * 
    * @param array $data
    * @param int $idUSer 
    */
   public function updateUser($data, $idUser)
   {
      if(array_key_exists('password', $data) === true and $data['password'] !== '') {
         $data['password'] = $this->_getMd5Password($data['password']);
      }else if(array_key_exists('password', $data)) {
          unset($data['password']);
      }
      // Установка группы пользователя
      if(array_key_exists('group_name', $data) === true) {
          $data['id_group'] = (int)$data['group_name'];
      }
      
      $this->_sql->updateUser($data, $idUser);
      return;
   }
   
   /**
    * Вернет перечень групп пользователей.
    * ключ id группы значения названия группы
    * 
    * @return array
    */
   public function getGroupSystem()
   {
       return $this->_sql->getGroupSystem();
   }
   
   /**
    * Вернет id пользователя по его id
    * @param string $login
    * @return int|false
    */
   public function getIdUser($login)
   {
       $data = $this->_db->fetchRow($this->_sql->getUserLogiOrEmail($login));  
       if($data === false) {
           return false;
       }
       return (int)$data['id'];
   }
   
   /**
    * Получения данных пользователя по логину и паролю.
    * 
    * @param sting $login
    * @param string $password
    * @param bool $codePassword кодировать ли паспорт внутреним методом.
    * @return array|false
    */
   public function getDataUser($login, $password, $codePassword = true)
   {   
      if($codePassword) {
          $password = $this->_getMd5Password($password);
      } 
      return $this->_db->fetchRow($this->_sql->getDataUser($login, $password));
   }
   
   /**
    * Получения всех пользователей.
    * 
    * @param  bool $returnSelect
    * @return array|Zend_Db_Select
    */
   public function getUsers($returnSelect = true)
   {
       return $this->_sql->getUsers($returnSelect);
   }
   
   /**
    * Получения системно ключа пользователя по его login
    * @param string $login
    * @return string|false
    */
   public function getUserKey($login)
   {
      return $this->_sql->getUserKey($login);
   }
   
   /**
    * Удаления пользователя по его id
    * @param int $idUser
    */
   public function deleteUser($idUser)
   {
     $this->_sql->deleteUser($idUser);
   }
   
 /**
  * Вернет md5 паспорта
  * @param $password
  * @return string
  */
 protected function _getMd5Password($password)
 {
    return md5($password);
 }
 

  /**
   * Отсылка письма для регистрации пользователя в системе.
   * 
   * @param $toEmail
   * @param $toName
   */
  protected  function _setMessageRegister($toEmail, $toName, $keyRegister)
  {
    $mail = new Arm_Mail();
    $mail->setBodyTemplate('register', array('name'=>$toName, 'email'=>$toEmail, 'key'=>$keyRegister));
    $config = Arm_Module::getInstance()->getConfig('user');
    $mail->SetFrom($config->register->from->email, $config->register->from->name);
    $mail->AddAddress($toEmail, $toName);
    $mail->Send();
  }
  


}
